package com.example.controller;

import java.util.List;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class ConsumerController {

	private Logger logger = LoggerFactory.getLogger(ConsumerController.class);

	@Autowired
	private DiscoveryClient discoveryClient;

	@Resource
	private RestTemplate restTemplate;

	@GetMapping("/consumer/msg")
	public String getProviderMessage() {
		
		 //关键点：将原有IP:端口替换为服务名，RestTemplate便会在通信前自动利用Ribbon查询可用provider-service实例列表
        //再根据负载均衡策略选择节点实例
        String result = restTemplate.getForObject("http://nacos-discovery-provider/provider/msg", String.class);
		// ----------------------------
//		List<ServiceInstance> serviceInstances = discoveryClient.getInstances("nacos-discovery-provider");
//		ServiceInstance serviceInstance = serviceInstances.get(0);
//		// 获取服务实例的 IP 地址
//		String host = serviceInstance.getHost();
//		// 获取服务实例的端口
//		int port = serviceInstance.getPort();
//		// 在日志中打印服务实例信息
//		logger.info("本次调用由provider-service的" + host + ":" + port + " 实例节点负责处理");
//		// 通过 RestTemplate 对象的 getForObject() 方法向指定 URL 发送请求，并接收响应。
//		// getForObject()方法有两个参数：
//		// 1. 具体发送的 URL，结合当前环境发送地址为：http://192.168.31.111:80/provider/msg
//		// 2. String.class说明 URL 返回的是纯字符串，如果第二参数是实体类， RestTemplate 会自动进行反序列化，为实体属性赋值
//		String result = restTemplate.getForObject("http://" + host + ":" + port + "/provider/msg", String.class);
//		// --------------------------
		// 输出响应内容
		logger.info("provider-service 响应数据:" + result);
		// 向浏览器返回响应
		return "consumer-service 响应数据:" + result;
	}

}
